domnr = (domnr+1) & ((1<<20)-1);
if ( (p = find_domain_by_id(domnr)) == NULL )
return domnr;
- free_task_struct(p);
+ put_task_struct(p);
}
return 0;
case DOM0_BUILDDOMAIN:
{
struct task_struct * p = find_domain_by_id(op.u.meminfo.domain);
- if ( (ret = final_setup_guestos(p, &op.u.meminfo)) != 0 )
- break;
- ret = p->domain;
- free_task_struct(p);
+ if ( (ret = final_setup_guestos(p, &op.u.meminfo)) == 0 )
+ ret = p->domain;
+ put_task_struct(p);
}
break;
{
struct task_struct * p = find_domain_by_id(op.u.meminfo.domain);
ret = -EINVAL;
- if ( (p == NULL) || !(p->flags & PF_CONSTRUCTED) )
- break;
- wake_up(p);
- reschedule(p);
- ret = p->domain;
- free_task_struct(p);
+ if ( (p != NULL) && (p->flags & PF_CONSTRUCTED) )
+ {
+ wake_up(p);
+ reschedule(p);
+ ret = p->domain;
+ }
+ put_task_struct(p);
}
break;
case DOM0_STOPDOMAIN:
{
- ret = stop_other_domain (op.u.meminfo.domain);
+ ret = stop_other_domain (op.u.meminfo.domain);
}
break;
goto exit_create;
if (op.u.newdomain.name[0]) {
- strncpy (p -> name, op.u.newdomain.name, MAX_DOMAIN_NAME);
- p -> name[MAX_DOMAIN_NAME - 1] = 0;
+ strncpy (p -> name, op.u.newdomain.name, MAX_DOMAIN_NAME);
+ p -> name[MAX_DOMAIN_NAME - 1] = 0;
}
ret = alloc_new_dom_mem(p, op.u.newdomain.memory_kb);
unsigned long warpl = op.u.adjustdom.warpl;
unsigned long warpu = op.u.adjustdom.warpu;
-
if ( dom == IDLE_DOMAIN_ID )
{
ret = -EPERM;
case DOM0_GETDOMAININFO:
{
- struct task_struct *p;
- u_long flags;
-
- p = idle0_task.next_task;
- read_lock_irqsave (&tasklist_lock, flags);
- do {
- if ((!is_idle_task (p)) && (p -> domain >= op.u.getdominfo.domain)) {
- break;
- }
- } while ((p = p -> next_task) != &idle0_task);
+ struct task_struct *p;
+ u_long flags;
+
+ p = idle0_task.next_task;
+ read_lock_irqsave (&tasklist_lock, flags);
+ do {
+ if ((!is_idle_task (p)) && (p -> domain >= op.u.getdominfo.domain))
+ break;
+ } while ((p = p -> next_task) != &idle0_task);
- if (p == &idle0_task) {
ret = -ESRCH;
- } else {
- op.u.getdominfo.domain = p -> domain;
- strcpy (op.u.getdominfo.name, p -> name);
- op.u.getdominfo.processor = p -> processor;
- op.u.getdominfo.has_cpu = p -> has_cpu;
- op.u.getdominfo.state = p -> state;
- op.u.getdominfo.hyp_events = p -> hyp_events;
- op.u.getdominfo.mcu_advance = p -> mcu_advance;
- op.u.getdominfo.pg_head = list_entry(p->pg_head.next,
- struct pfn_info, list) - frame_table;
- op.u.getdominfo.tot_pages = p -> tot_pages;
- }
- read_unlock_irqrestore (&tasklist_lock, flags);
- copy_to_user(u_dom0_op, &op, sizeof(op));
- break;
+ if ( p != &idle0_task )
+ {
+ op.u.getdominfo.domain = p->domain;
+ strcpy (op.u.getdominfo.name, p->name);
+ op.u.getdominfo.processor = p->processor;
+ op.u.getdominfo.has_cpu = p->has_cpu;
+ op.u.getdominfo.state = p->state;
+ op.u.getdominfo.hyp_events = p->hyp_events;
+ op.u.getdominfo.mcu_advance = p->mcu_advance;
+ op.u.getdominfo.pg_head =
+ list_entry(p->pg_head.next, struct pfn_info, list) -
+ frame_table;
+ op.u.getdominfo.tot_pages = p->tot_pages;
+ }
+
+ read_unlock_irqrestore(&tasklist_lock, flags);
+ copy_to_user(u_dom0_op, &op, sizeof(op));
+ break;
}
default:
}
else
{
- free_task_struct(p);
+ put_task_struct(p);
}
}
guest_event_notify(cpu_mask);
}
- free_task_struct(p);
+ put_task_struct(p);
return 0;
}
void stop_domain(void)
{
- current -> state = TASK_SUSPENDED;
- clear_bit(_HYP_EVENT_STOP, &(current->hyp_events));
- schedule ();
+ current -> state = TASK_SUSPENDED;
+ clear_bit(_HYP_EVENT_STOP, &(current->hyp_events));
+ schedule ();
}
long stop_other_domain(unsigned int dom)
{
- unsigned long cpu_mask;
- struct task_struct *p;
-
- p = find_domain_by_id (dom);
- if ( p == NULL) return -ESRCH;
-
- if ( p -> state != TASK_SUSPENDED )
+ unsigned long cpu_mask;
+ struct task_struct *p;
+
+ p = find_domain_by_id (dom);
+ if ( p == NULL) return -ESRCH;
+
+ if ( p->state != TASK_SUSPENDED )
{
- cpu_mask = mark_hyp_event(p, _HYP_EVENT_STOP);
- hyp_event_notify(cpu_mask);
+ cpu_mask = mark_hyp_event(p, _HYP_EVENT_STOP);
+ hyp_event_notify(cpu_mask);
}
-
- return 0;
+
+ put_task_struct(p);
+ return 0;
}
unsigned int alloc_new_dom_mem(struct task_struct *p, unsigned int kbytes)
{
list_del(&p->blkdev_list);
p->blkdev_list.next = NULL;
- free_task_struct(p);
+ put_task_struct(p);
}
spin_unlock_irqrestore(&io_schedule_list_lock, flags);
}
remove_from_blkdev_list(p);
if ( do_block_io_op_domain(p, BATCH_PER_DOMAIN) )
add_to_blkdev_list_tail(p);
- free_task_struct(p);
+ put_task_struct(p);
}
/* Push the batch through to disc. */
{
make_response(pending_req->domain, pending_req->id,
pending_req->operation, pending_req->status);
- free_task_struct(pending_req->domain);
+ put_task_struct(pending_req->domain);
spin_lock_irqsave(&pend_prod_lock, flags);
pending_ring[pending_prod] = pending_req - pending_reqs;
PENDREQ_IDX_INC(pending_prod);
{
list_del(&p->blkdev_list);
p->blkdev_list.next = (void *)0xdeadbeef; /* prevent reinsertion */
- free_task_struct(p);
+ put_task_struct(p);
}
spin_unlock_irqrestore(&io_schedule_list_lock, flags);
}